/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.claro.administracionSolicitudes.beans;

import co.com.claro.administracionSolicitudes.datamodel.SolicitudesDynamicDataModel;
import co.com.claro.administracionSolicitudes.db.EJBDatabaseSolicitudesLocal;
import co.com.claro.administracionSolicitudes.dto.SolicitudDto;
import co.com.claro.administracionSolicitudes.entity.Aplicacion;
import co.com.claro.administracionSolicitudes.entity.Gerencia;
import co.com.claro.administracionSolicitudes.entity.Grupo;
import co.com.claro.administracionSolicitudes.entity.Perfil;
import co.com.claro.administracionSolicitudes.entity.PrivilegioSolicitud;
import co.com.claro.administracionSolicitudes.entity.enums.AccionesEnum;
import co.com.claro.administracionSolicitudes.entity.enums.EstadoActividadEnum;
import co.com.claro.administracionSolicitudes.entity.enums.EstadosSolicitudEnum;
import co.com.claro.administracionSolicitudes.entity.enums.GruposEnum;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

/**
 *
 * @author USUARIO
 */
@ManagedBean
@ViewScoped
public class ConsultaSolicitudesBean {

    //--------------------------------------------------------------------------
    // Atributos
    //--------------------------------------------------------------------------
    @EJB
    private EJBDatabaseSolicitudesLocal localDatabase;

    private SolicitudesDynamicDataModel solicitudes;

    private int filas = 30;

    private static final String COL_DEFAULT_SORT = "idSolicitud";

    private String columnaSorteada;
    private boolean ascendiente;

    @ManagedProperty(value = "#{usuarioSessionBean}")
    private UsuarioSessionBean sesionBean;

    private Grupo rol;

    private String idSolicitud;
    private String nombreSolicitante;
    private String nombreEjecutor;
    private String apellidoSolicitante;
    private String apelldoEjecutor;
    private String estadoSeleccionado;
    private String gerenciaAprobadoraSeleccionada;
    private String gerenciaAsignadoraSeleccionada;
    private String aplicacionSeleccionada;
    private String accionSeleccionada;
    private String perfilSeleccionado;
    private Date fechaInicioBusqueda;
    private Date fechaFinalBusqueda;

    private List<SelectItem> estadosItems;
    private List<SelectItem> gerenciasItems;
    private List<SelectItem> aplicacionesItems;
    private List<SelectItem> accionesItems;
    private List<SelectItem> perfilesItems;

    public ConsultaSolicitudesBean() {
    }

    @PostConstruct
    public void inicializarValores() {
        rol = sesionBean.obtenerRolUsuario();

        columnaSorteada = COL_DEFAULT_SORT;
        ascendiente = true;

        llenarFiltros();
        llenarSolicitudes();
    }

    //--------------------------------------------------------------------------
    // Metodos propios del Bean
    //--------------------------------------------------------------------------
    /**
     * Método que se encarga de llenar los filtros de los select en el cargue
     * inicial de la pagina.
     */
    private void llenarFiltros() {

        List<Aplicacion> aplicaciones = new ArrayList<Aplicacion>();

        if (rol.getIdGrupo().equals(GruposEnum.ADMINISTRADOR.getId())
                || rol.getIdGrupo().equals(GruposEnum.ASIGNADOR.getId())
                || rol.getIdGrupo().equals(GruposEnum.EJECUTOR.getId())) {
            aplicaciones = localDatabase.findAplicacionByEstado(EstadoActividadEnum.ACTIVO.getId());
        } else {
            List<PrivilegioSolicitud> privilegios = localDatabase.findPrivilegioByGerencia(sesionBean.getUsuario().getGerencia().getIdGerencia());

            for (PrivilegioSolicitud p : privilegios) {
                aplicaciones.add(p.getIdAplicacion());
            }
        }
        List<Gerencia> gerencias = localDatabase.findGerenciaByEstado(EstadoActividadEnum.ACTIVO.getId());

        llenarAplicaciones(aplicaciones);
        llenarGerencias(gerencias);
        llenarEstados();
        llenarAcciones();
    }

    /**
     * Método que llena la lista de aplicaciones para mostrarle al usuario
     *
     * @param aplicaciones, las aplicaciones de la base de datos
     */
    private void llenarAplicaciones(List<Aplicacion> aplicaciones) {
        if (aplicacionesItems == null) {
            aplicacionesItems = new ArrayList<SelectItem>();
        }
        for (Aplicacion temporal : aplicaciones) {
            aplicacionesItems.add(new SelectItem(temporal.getIdAplicacion(), temporal.getNombre()));
        }
    }

    /**
     * Método que llena la lista de gerencias para mostrarle al usuario
     *
     * @param gerencias, las gerencia de la base de datos
     */
    private void llenarGerencias(List<Gerencia> gerencias) {
        if (gerenciasItems == null) {
            gerenciasItems = new ArrayList<SelectItem>();
        }
        for (Gerencia temporal : gerencias) {
            gerenciasItems.add(new SelectItem(temporal.getIdGerencia(), temporal.getNombre()));
        }
    }

    private void llenarEstados() {
        if (estadosItems == null) {
            estadosItems = new ArrayList<SelectItem>();
        }
        estadosItems.add(new SelectItem(EstadosSolicitudEnum.POR_APROBAR.getId(), EstadosSolicitudEnum.POR_APROBAR.getEstado()));
        estadosItems.add(new SelectItem(EstadosSolicitudEnum.POR_ASIGNAR.getId(), EstadosSolicitudEnum.POR_ASIGNAR.getEstado()));
        estadosItems.add(new SelectItem(EstadosSolicitudEnum.POR_EJECUTAR.getId(), EstadosSolicitudEnum.POR_EJECUTAR.getEstado()));
        estadosItems.add(new SelectItem(EstadosSolicitudEnum.CERRADO.getId(), EstadosSolicitudEnum.CERRADO.getEstado()));
        estadosItems.add(new SelectItem(EstadosSolicitudEnum.CANCELADO.getId(), EstadosSolicitudEnum.CANCELADO.getEstado()));
    }

    private void llenarAcciones() {
        if (accionesItems == null) {
            accionesItems = new ArrayList<SelectItem>();
        }
        accionesItems.add(new SelectItem(AccionesEnum.CAMBIO_PASSWORD.getId(), AccionesEnum.CAMBIO_PASSWORD.getNombre()));
        accionesItems.add(new SelectItem(AccionesEnum.CAMBIO_PERFIL.getId(), AccionesEnum.CAMBIO_PERFIL.getNombre()));
        accionesItems.add(new SelectItem(AccionesEnum.CREACION.getId(), AccionesEnum.CREACION.getNombre()));
        accionesItems.add(new SelectItem(AccionesEnum.ELIMINACION.getId(), AccionesEnum.ELIMINACION.getNombre()));
    }

    private void llenarSolicitudes() {
        SolicitudDto dto = new SolicitudDto();

        dto.setAscendiente(ascendiente);
        dto.setCampoSorteado(columnaSorteada);

        if (solicitudes == null) {
            if (rol.getIdGrupo().equals(GruposEnum.ADMINISTRADOR.getId())
                    || rol.getIdGrupo().equals(GruposEnum.ASIGNADOR.getId())) {
                solicitudes = new SolicitudesDynamicDataModel(localDatabase);
            } else if (rol.getIdGrupo().equals(GruposEnum.APROBADOR.getId())) {
                dto.setIdGerenciaAprobadora(sesionBean.getUsuario().getGerencia().getIdGerencia());
                solicitudes = new SolicitudesDynamicDataModel(localDatabase, dto);
            } else {
                dto.setIdSolicitante(sesionBean.getUsuario().getIdUsuario());
                solicitudes = new SolicitudesDynamicDataModel(localDatabase, dto);
            }
        }
    }

    //--------------------------------------------------------------------------
    // Eventos del Bean
    //--------------------------------------------------------------------------
    public void buscarSolicitudes() {
        SolicitudDto dto = new SolicitudDto();

        if (rol.getIdGrupo().equals(GruposEnum.APROBADOR.getId())
                && !rol.getIdGrupo().equals(GruposEnum.ADMINISTRADOR.getId())) {
            dto.setIdGerenciaAprobadora(sesionBean.getUsuario().getGerencia().getIdGerencia());
        } else if (rol.getIdGrupo().equals(GruposEnum.SOLICITANTE.getId())) {
            dto.setIdSolicitante(sesionBean.getUsuario().getIdUsuario());
        }

        if (idSolicitud != null && !idSolicitud.isEmpty()) {
            dto.setIdSolicitud(Integer.parseInt(idSolicitud));
        }
        if (accionSeleccionada != null) {
            dto.setIdAccion(Short.parseShort(accionSeleccionada));
        }
        if (aplicacionSeleccionada != null) {
            dto.setIdAplicacion(Integer.parseInt(aplicacionSeleccionada));
        }
        if (estadoSeleccionado != null) {
            dto.setIdEstado(Short.parseShort(estadoSeleccionado));
        }
        if (fechaInicioBusqueda != null && fechaFinalBusqueda != null) {
            dto.setFechaInicioBusqueda(fechaInicioBusqueda);

            Calendar finDia = Calendar.getInstance();
            finDia.setTime(fechaFinalBusqueda);
            finDia.set(Calendar.HOUR_OF_DAY, 23);
            finDia.set(Calendar.MINUTE, 59);
            finDia.set(Calendar.SECOND, 59);

            dto.setFechaFinBusqueda(finDia.getTime());
        }
        if (gerenciaAprobadoraSeleccionada != null) {
            dto.setIdGerenciaAprobadora(Short.parseShort(gerenciaAprobadoraSeleccionada));
        }
        if (gerenciaAsignadoraSeleccionada != null) {
            dto.setIdGerenciaAsignadora(Short.parseShort(gerenciaAsignadoraSeleccionada));
        }
        if (nombreSolicitante != null && !nombreSolicitante.isEmpty()) {
            dto.setNombreSolicitante(nombreSolicitante);
        }
        if (nombreEjecutor != null && !nombreEjecutor.isEmpty()) {
            dto.setNombreEjecutor(nombreEjecutor);
        }
        if (apellidoSolicitante != null && !apellidoSolicitante.isEmpty()) {
            dto.setApellidoSolicitante(apellidoSolicitante);
        }
        if (apelldoEjecutor != null && !apelldoEjecutor.isEmpty()) {
            dto.setApellidoEjecutor(apelldoEjecutor);
        }
        if (perfilSeleccionado != null) {
            dto.setIdPerfil(Integer.parseInt(perfilSeleccionado));
        }

        dto.setAscendiente(ascendiente);
        dto.setCampoSorteado(columnaSorteada);

        solicitudes = new SolicitudesDynamicDataModel(localDatabase, dto);
    }

    public void llenarPerfiles() {
        perfilesItems = new ArrayList<SelectItem>();

        if (aplicacionSeleccionada != null) {

            if (rol.getIdGrupo().equals(GruposEnum.ADMINISTRADOR.getId())
                    || rol.getIdGrupo().equals(GruposEnum.ASIGNADOR.getId())) {
                List<Perfil> perfiles = localDatabase.findPerfilByEstado(EstadoActividadEnum.ACTIVO.getId());

                for (Perfil perfil : perfiles) {
                    perfilesItems.add(new SelectItem(
                            perfil.getIdPerfil(), perfil.getNombre()));
                }
            } else {
                List<PrivilegioSolicitud> privilegios = localDatabase.findPrivilegioByAplicacionGerencia(Integer.parseInt(aplicacionSeleccionada),
                        sesionBean.getUsuario().getGerencia().getIdGerencia());

                for (PrivilegioSolicitud privilegioSolicitud : privilegios) {
                    perfilesItems.add(new SelectItem(
                            privilegioSolicitud.getIdPerfil().getIdPerfil(),
                            privilegioSolicitud.getIdPerfil().getNombre()));
                }
            }
        }
    }

    public void limpiarCampos() {
        idSolicitud = null;
        nombreSolicitante = null;
        nombreEjecutor = null;
        apellidoSolicitante = null;
        apelldoEjecutor = null;
        estadoSeleccionado = null;
        gerenciaAprobadoraSeleccionada = null;
        gerenciaAsignadoraSeleccionada = null;
        aplicacionSeleccionada = null;
        accionSeleccionada = null;
        perfilSeleccionado = null;
        fechaInicioBusqueda = null;
        fechaFinalBusqueda = null;

        solicitudes = null;

        columnaSorteada = COL_DEFAULT_SORT;
        ascendiente = true;

        llenarSolicitudes();
    }

    public boolean paginado() {
        return solicitudes.getTotalCount() > filas;
    }

    public void ordenar() {
        String property = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()
                .get("sortProperty");

        if (property != null) {
            if (columnaSorteada.equals(property)) {
                ascendiente = !ascendiente;
            } else {
                columnaSorteada = property;
                ascendiente = true;
            }
        }

        buscarSolicitudes();
    }

    //--------------------------------------------------------------------------
    // Getters y Setters
    //--------------------------------------------------------------------------
    public UsuarioSessionBean getSesionBean() {
        return sesionBean;
    }

    public void setSesionBean(UsuarioSessionBean sesionBean) {
        this.sesionBean = sesionBean;
    }

    public int getFilas() {
        return filas;
    }

    public SolicitudesDynamicDataModel getSolicitudes() {
        return solicitudes;
    }

    public void setSolicitudes(SolicitudesDynamicDataModel solicitudes) {
        this.solicitudes = solicitudes;
    }

    public String getIdSolicitud() {
        return idSolicitud;
    }

    public void setIdSolicitud(String idSolicitud) {
        this.idSolicitud = idSolicitud;
    }

    public String getNombreSolicitante() {
        return nombreSolicitante;
    }

    public void setNombreSolicitante(String nombreSolicitante) {
        this.nombreSolicitante = nombreSolicitante;
    }

    public String getNombreEjecutor() {
        return nombreEjecutor;
    }

    public void setNombreEjecutor(String nombreEjecutor) {
        this.nombreEjecutor = nombreEjecutor;
    }

    public String getApellidoSolicitante() {
        return apellidoSolicitante;
    }

    public void setApellidoSolicitante(String apellidoSolicitante) {
        this.apellidoSolicitante = apellidoSolicitante;
    }

    public String getApelldoEjecutor() {
        return apelldoEjecutor;
    }

    public void setApelldoEjecutor(String apelldoEjecutor) {
        this.apelldoEjecutor = apelldoEjecutor;
    }

    public String getEstadoSeleccionado() {
        return estadoSeleccionado;
    }

    public void setEstadoSeleccionado(String estadoSeleccionado) {
        this.estadoSeleccionado = estadoSeleccionado;
    }

    public String getAplicacionSeleccionada() {
        return aplicacionSeleccionada;
    }

    public void setAplicacionSeleccionada(String aplicacionSeleccionada) {
        this.aplicacionSeleccionada = aplicacionSeleccionada;
    }

    public String getAccionSeleccionada() {
        return accionSeleccionada;
    }

    public void setAccionSeleccionada(String accionSeleccionada) {
        this.accionSeleccionada = accionSeleccionada;
    }

    public String getPerfilSeleccionado() {
        return perfilSeleccionado;
    }

    public void setPerfilSeleccionado(String perfilSeleccionado) {
        this.perfilSeleccionado = perfilSeleccionado;
    }

    public Date getFechaInicioBusqueda() {
        return fechaInicioBusqueda;
    }

    public void setFechaInicioBusqueda(Date fechaInicioBusqueda) {
        this.fechaInicioBusqueda = fechaInicioBusqueda;
    }

    public Date getFechaFinalBusqueda() {
        return fechaFinalBusqueda;
    }

    public void setFechaFinalBusqueda(Date fechaFinalBusqueda) {
        this.fechaFinalBusqueda = fechaFinalBusqueda;
    }

    public List<SelectItem> getEstadosItems() {
        return estadosItems;
    }

    public void setEstadosItems(List<SelectItem> estadosItems) {
        this.estadosItems = estadosItems;
    }

    public List<SelectItem> getGerenciasItems() {
        return gerenciasItems;
    }

    public void setGerenciasItems(List<SelectItem> gerenciasItems) {
        this.gerenciasItems = gerenciasItems;
    }

    public List<SelectItem> getAplicacionesItems() {
        return aplicacionesItems;
    }

    public void setAplicacionesItems(List<SelectItem> aplicacionesItems) {
        this.aplicacionesItems = aplicacionesItems;
    }

    public List<SelectItem> getAccionesItems() {
        return accionesItems;
    }

    public void setAccionesItems(List<SelectItem> accionesItems) {
        this.accionesItems = accionesItems;
    }

    public List<SelectItem> getPerfilesItems() {
        return perfilesItems;
    }

    public String getGerenciaAprobadoraSeleccionada() {
        return gerenciaAprobadoraSeleccionada;
    }

    public void setGerenciaAprobadoraSeleccionada(String gerenciaAprobadoraSeleccionada) {
        this.gerenciaAprobadoraSeleccionada = gerenciaAprobadoraSeleccionada;
    }

    public String getGerenciaAsignadoraSeleccionada() {
        return gerenciaAsignadoraSeleccionada;
    }

    public void setGerenciaAsignadoraSeleccionada(String gerenciaAsignadoraSeleccionada) {
        this.gerenciaAsignadoraSeleccionada = gerenciaAsignadoraSeleccionada;
    }

    public void setPerfilesItems(List<SelectItem> perfilesItems) {
        this.perfilesItems = perfilesItems;
    }

    public boolean isAscendiente() {
        return ascendiente;
    }

}
